import os
import subprocess

class AudioToVideoConverter:
    """
    将音频文件批量转换为带固定图片的视频文件（如MP4）。
    使用 ffmpeg 实现。
    """

    def __init__(self, input_dir=None, image_path=None, output_dir=None):
        """
        初始化转换器。

        Args:
            input_dir (str): 输入音频文件夹路径。
            image_path (str): 图片文件路径（将作为视频画面）。
            output_dir (str): 输出视频文件夹路径。
        """
        self.input_dir = input_dir
        self.image_path = image_path
        self.output_dir = output_dir

    # === Setter 方法 ===
    def set_input_dir(self, input_dir: str):
        """设置输入音频文件夹路径"""
        self.input_dir = input_dir

    def set_image_path(self, image_path: str):
        """设置固定图片路径"""
        self.image_path = image_path

    def set_output_dir(self, output_dir: str):
        """设置输出文件夹路径"""
        self.output_dir = output_dir

    # === 主功能函数 ===
    def convert(self):
        """执行音频到视频的批量转换"""
        if not all([self.input_dir, self.image_path, self.output_dir]):
            raise ValueError("请先设置 input_dir, image_path, output_dir。")

        # 确保输出目录存在
        os.makedirs(self.output_dir, exist_ok=True)

        # 遍历音频文件
        for file_name in os.listdir(self.input_dir):
            if not file_name.lower().endswith((".mp3", ".wav", ".flac", ".aac", ".m4a", ".ogg")):
                continue  # 跳过非音频文件

            audio_path = os.path.join(self.input_dir, file_name)
            output_path = os.path.join(
                self.output_dir,
                os.path.splitext(file_name)[0] + ".mp4"
            )

            # ffmpeg 命令
            cmd = [
                "ffmpeg",
                "-y",  # 覆盖输出文件
                "-loop", "1",
                "-i", self.image_path,
                "-i", audio_path,
                "-vf", "scale=trunc(iw/2)*2:trunc(ih/2)*2",  # 确保宽高为偶数
                "-c:v", "libx264",
                "-c:a", "aac",
                "-b:a", "192k",
                "-pix_fmt", "yuv420p",
                "-shortest",
                output_path
            ]

            print(f"🎬 正在处理: {audio_path} -> {output_path}")
            subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True)

        print("✅ 所有文件已成功转换完成。")

# === 使用示例 ===
if __name__ == "__main__":
    converter = AudioToVideoConverter(
        input_dir=r"C:\Users\33720\Desktop\日语读物合集\《日本文化常识大全》 音频CMP3",
        image_path=r"C:\Users\33720\Desktop\1.png",
        output_dir=r"C:\Users\33720\Desktop\日语读物合集\《日本文化常识大全》 音频MP3Over"
    )

    # 如果需要可以修改参数：
    # converter.set_input_dir("新的路径")
    # converter.set_image_path("新的图片路径")
    # converter.set_output_dir("新的输出路径")

    converter.convert()
